/*******************************************************************************
* Copyright (c) 2000, 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.ui.refactoring.reorg;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.ltk.core.refactoring.Refactoring;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.corext.refactoring.reorg.ICreateTargetQuery;
import org.eclipse.jdt.internal.corext.refactoring.reorg.IReorgDestinationValidator;
import org.eclipse.jdt.internal.corext.refactoring.reorg.JavaMoveProcessor;
import org.eclipse.jdt.internal.corext.refactoring.reorg.ReorgDestinationFactory;
import org.eclipse.jdt.internal.corext.util.Messages;
import org.eclipse.jdt.ui.JavaElementLabels;
import org.eclipse.jdt.internal.ui.refactoring.QualifiedNameComponent;
import org.eclipse.jdt.internal.ui.refactoring.RefactoringMessages;
import org.eclipse.jdt.internal.ui.util.SWTUtil;
import org.eclipse.jdt.internal.ui.viewsupport.BasicElementLabels;
public class ReorgMoveWizard extends RefactoringWizard {
private static final String UPDATE_QUALIFIED_NAMES= "moveWizard.updateQualifiedNames"; //$NON-NLS-1$
private final JavaMoveProcessor fMoveProcessor;
public ReorgMoveWizard(JavaMoveProcessor moveProcessor, Refactoring ref) {
super(ref, DIALOG_BASED_USER_INTERFACE);
fMoveProcessor= moveProcessor;
if (isTextualMove(fMoveProcessor))
setDefaultPageTitle(ReorgMessages.ReorgMoveWizard_textual_move);
else
setDefaultPageTitle(ReorgMessages.ReorgMoveWizard_3);
}
private static boolean isTextualMove(JavaMoveProcessor moveProcessor) {
return moveProcessor.isTextualMove();
}
protected void addUserInputPages() {
addPage(new MoveInputPage(fMoveProcessor));
}
private static class MoveInputPage extends ReorgUserInputPage{
private static final String PAGE_NAME= "MoveInputPage"; //$NON-NLS-1$
private static final long LABEL_FLAGS= JavaElementLabels.ALL_DEFAULT
| JavaElementLabels.M_PRE_RETURNTYPE | JavaElementLabels.M_PARAMETER_NAMES | JavaElementLabels.F_PRE_TYPE_SIGNATURE;
private Button fReferenceCheckbox;
private Button fQualifiedNameCheckbox;
private QualifiedNameComponent fQualifiedNameComponent;
private ICreateTargetQuery fCreateTargetQuery;
private Object fDestination;
private final JavaMoveProcessor fMoveProcessor;
public MoveInputPage(JavaMoveProcessor moveProcessor) {
super(PAGE_NAME);
fMoveProcessor= moveProcessor;
}
private JavaMoveProcessor getJavaMoveProcessor(){
return fMoveProcessor;
}
protected Object getInitiallySelectedElement() {
return getJavaMoveProcessor().getCommonParentForInputElements();
}
protected IJavaElement[] getJavaElements() {
return getJavaMoveProcessor().getJavaElements();
}
protected IResource[] getResources() {
return getJavaMoveProcessor().getResources();
}
protected IReorgDestinationValidator getDestinationValidator() {
return getJavaMoveProcessor();
}
protected boolean performFinish() {
return super.performFinish() || getJavaMoveProcessor().wasCanceled(); //close the dialog if canceled
}
protected RefactoringStatus verifyDestination(Object selected) throws JavaModelException{
JavaMoveProcessor processor= getJavaMoveProcessor();
final RefactoringStatus refactoringStatus= processor.setDestination(ReorgDestinationFactory.createDestination(selected));
updateUIStatus();
fDestination= selected;
return refactoringStatus;
}
private void updateUIStatus() {
getRefactoringWizard().setForcePreviewReview(false);
JavaMoveProcessor processor= getJavaMoveProcessor();
if (fReferenceCheckbox != null){
processor.setUpdateReferences(fReferenceCheckbox.getSelection());
}
if (fQualifiedNameCheckbox != null){
boolean enabled= processor.canEnableQualifiedNameUpdating();
fQualifiedNameCheckbox.setEnabled(enabled);
if (enabled) {
fQualifiedNameComponent.setEnabled(processor.getUpdateQualifiedNames());
if (processor.getUpdateQualifiedNames())
getRefactoringWizard().setForcePreviewReview(true);
} else {
fQualifiedNameComponent.setEnabled(false);
}
processor.setUpdateQualifiedNames(fQualifiedNameCheckbox.getEnabled() && fQualifiedNameCheckbox.getSelection());
}
}
private void addUpdateReferenceComponent(Composite result) {
final JavaMoveProcessor processor= getJavaMoveProcessor();
if (! processor.canUpdateJavaReferences())
return;
String text;
int resources= getResources().length;
int javaElements= getJavaElements().length;
if (resources == 0 && javaElements == 1) {
text= Messages.format(
ReorgMessages.JdtMoveAction_update_references_singular,
JavaElementLabels.getElementLabel(getJavaElements()[0], LABEL_FLAGS));
} else if (resources == 1 && javaElements == 0) {
text= Messages.format(
ReorgMessages.JdtMoveAction_update_references_singular,
BasicElementLabels.getResourceName(getResources()[0]));
} else {
text= Messages.format(
ReorgMessages.JdtMoveAction_update_references_plural,
String.valueOf(resources + javaElements));
}
fReferenceCheckbox= new Button(result, SWT.CHECK);
fReferenceCheckbox.setText(text);
fReferenceCheckbox.setSelection(processor.getUpdateReferences());
fReferenceCheckbox.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
processor.setUpdateReferences(((Button)e.widget).getSelection());
updateUIStatus();
}
});
}
private void addUpdateQualifiedNameComponent(Composite parent, int marginWidth) {
final JavaMoveProcessor processor= getJavaMoveProcessor();
if (!processor.canEnableQualifiedNameUpdating() || !processor.canUpdateQualifiedNames())
return;
fQualifiedNameCheckbox= new Button(parent, SWT.CHECK);
int indent= marginWidth + fQualifiedNameCheckbox.computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
fQualifiedNameCheckbox.setText(RefactoringMessages.RenameInputWizardPage_update_qualified_names);
fQualifiedNameCheckbox.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
fQualifiedNameCheckbox.setSelection(processor.getUpdateQualifiedNames());
fQualifiedNameComponent= new QualifiedNameComponent(parent, SWT.NONE, processor, getRefactoringSettings());
fQualifiedNameComponent.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
GridData gd= (GridData)fQualifiedNameComponent.getLayoutData();
gd.horizontalAlignment= GridData.FILL;
gd.horizontalIndent= indent;
updateQualifiedNameUpdating(processor, processor.getUpdateQualifiedNames());
fQualifiedNameCheckbox.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
boolean enabled= ((Button)e.widget).getSelection();
updateQualifiedNameUpdating(processor, enabled);
}
});
fQualifiedNameCheckbox.setSelection(getRefactoringSettings().getBoolean(UPDATE_QUALIFIED_NAMES));
updateQualifiedNameUpdating(processor, fQualifiedNameCheckbox.getSelection());
}
private void updateQualifiedNameUpdating(final JavaMoveProcessor processor, boolean enabled) {
fQualifiedNameComponent.setEnabled(enabled);
processor.setUpdateQualifiedNames(enabled);
updateUIStatus();
}
public void createControl(Composite parent) {
Composite result;
boolean showDestinationTree= ! getJavaMoveProcessor().hasDestinationSet();
if (showDestinationTree) {
fCreateTargetQuery= getJavaMoveProcessor().getCreateTargetQuery();
super.createControl(parent);
getTreeViewer().getTree().setFocus();
result= (Composite)super.getControl();
} else {
initializeDialogUnits(parent);
result= new Composite(parent, SWT.NONE);
setControl(result);
result.setLayout(new GridLayout());
Dialog.applyDialogFont(result);
}
addUpdateReferenceComponent(result);
addUpdateQualifiedNameComponent(result, ((GridLayout)result.getLayout()).marginWidth);
setControl(result);
Dialog.applyDialogFont(result);
}
protected Control addLabel(Composite parent) {
if (fCreateTargetQuery != null) {
Composite firstLine= new Composite(parent, SWT.NONE);
GridLayout layout= new GridLayout(2, false);
layout.marginHeight= layout.marginWidth= 0;
firstLine.setLayout(layout);
firstLine.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Control label= super.addLabel(firstLine);
label.addTraverseListener(new TraverseListener() {
public void keyTraversed(TraverseEvent e) {
if (e.detail == SWT.TRAVERSE_MNEMONIC && e.doit) {
e.detail= SWT.TRAVERSE_NONE;
getTreeViewer().getTree().setFocus();
}
}
});
Button newButton= new Button(firstLine, SWT.PUSH);
newButton.setText(fCreateTargetQuery.getNewButtonLabel());
GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.GRAB_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
gd.widthHint = SWTUtil.getButtonWidthHint(newButton);
newButton.setLayoutData(gd);
newButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
doNewButtonPressed();
}
});
return firstLine;
} else {
return super.addLabel(parent);
}
}
private void doNewButtonPressed() {
Object newElement= fCreateTargetQuery.getCreatedTarget(fDestination);
if (newElement != null) {
TreeViewer viewer= getTreeViewer();
ITreeContentProvider contentProvider= (ITreeContentProvider) viewer.getContentProvider();
viewer.refresh(contentProvider.getParent(newElement));
viewer.setSelection(new StructuredSelection(newElement), true);
viewer.getTree().setFocus();
}
}
/*
* @see org.eclipse.jface.dialogs.DialogPage#dispose()
*/
public void dispose() {
super.dispose();
IDialogSettings settings= getRefactoringSettings();
if (settings == null)
return;
if (fQualifiedNameCheckbox != null)
settings.put(ReorgMoveWizard.UPDATE_QUALIFIED_NAMES, fQualifiedNameCheckbox.getSelection());
if (fQualifiedNameComponent != null)
fQualifiedNameComponent.savePatterns(settings);
}
}
}